//
//  WBStatusListViewModel.swift
//  DJWeibo
//
//  Created by demo on 2017/4/6.
//  Copyright © 2017年 demo. All rights reserved.
//

import Foundation

//微博数据列表视图模型
//swift的类可以没有父类
//父类的选择
//如果类需要使用KVC或字典转模型框架设置对象值，就需要继承NSObject
//如果类只是封装了一些代码逻辑,可以不用任何父类，好处：更加轻量级

//负责微博的数据处理
//1、字典转模型
//2、下拉上拉刷新数据处理

//ViewModel抽取出来的目的是让ViewController只处理UI，网络请求返回的model数据处理让ViewModel执行，把模型数据的处理代码隔离出来

//上拉刷新尝试最大次数
private let maxPullupTryTimes = 3

class WBStatusListViewModel{
    //微博模型数组懒加载
    
    //pullUp  是否上拉刷新标记
    lazy var statusList = [WBStatus]()
    //上拉刷新错误次数
    //回调：[网络请求是否成功，是否有更多上拉刷新]
    private var pullupErrorTimes = 0
    func loadStatus(pullUp:Bool, completion:@escaping (_ isSuccess:Bool,_ hasMorePullup:Bool)->()){
        
        //判断是否是上拉刷新，同时检查刷新错误
        if pullUp && pullupErrorTimes > maxPullupTryTimes {
            completion(true, false)
            return
        }
        
        //since_id  : 取出第一条微博的id
        let since_id = pullUp ? 0 : (statusList.first?.id ?? 0)
        
        //上拉刷新，取出数组最后一条微博的id
        let max_id = !pullUp ? 0 : (statusList.last?.id ?? 0)
        
        
        WBNetworkManager.shared.statusList(since_id: since_id, max_id: max_id) { (list, isSuccess) in
        //字典转模型
            guard let array = NSArray.yy_modelArray(with: WBStatus.self, json: list ?? []) as? [WBStatus] else{
                completion(isSuccess, false)
                return
            }
            
            print("刷新到\(array.count)条数据")
//            gaurd let array = NSArray.yy_modelArray( with: WBStatus.self, json: list ?? [])else{
//                return
//            }
            //FIXME: 拼接数据
            if pullUp{
                self.statusList += array
            }else{
                //下拉刷新，应该将结果数组拼接在结果前面
                self.statusList = array + self.statusList
            }
            //判断上拉刷新的数据量
            if pullUp && array.count == 0{
                self.pullupErrorTimes += 1
                
                completion(isSuccess,false)
            }else{
                //完成回调
                //有数据时才刷新，没有数据时不会走网络请求，直接返回
                completion(isSuccess, true)
            }
            
        }
        
    }
}
